package yz.com.javautil.date;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Optional;

/**
 * @author Administrator
 */
public class DateTimeQuery {

    /**
     * 根据指定的起始时间和固定步长（这里是15分钟），找出给定时间所在的区间段的起点
     *
     * @param startTime    整个序列的第一个时间点
     * @param targetTime   需要查询的目标时间
     * @param intervalMins 步长（单位：分钟）
     * @return 如果找到匹配的区间，返回该区间的起点；否则返回空 Optional
     */
    public static Optional<LocalDateTime> findBelongingInterval(LocalDateTime startTime, LocalDateTime targetTime, long intervalMins) {
        // 确保目标时间不低于起始时间
        if (targetTime.isBefore(startTime)) {
            return Optional.empty(); // 早于第一个区间，无归属
        }

        // 计算从起始时间到目标时间的持续时间（以分钟为单位）
        long totalMinutesBetween = Duration.between(startTime, targetTime).toMinutes();

        // 向下取整得到完整的“块数”（即第几个15分钟段）
        long blockIndex = totalMinutesBetween / intervalMins;

        // 重新构造这个区块对应的开始时间
        LocalDateTime intervalStart = startTime.plusMinutes(blockIndex * intervalMins);

        // 检查是否真的落在这个区间内 [intervalStart, intervalStart + intervalMins)
        boolean withinRange = !targetTime.isBefore(intervalStart) && targetTime.isBefore(intervalStart.plusMinutes(intervalMins));

        return withinRange ? Optional.of(intervalStart) : Optional.empty();
    }

    public static void main(String[] args) {
        // 示例用法
        LocalDateTime startTime = LocalDateTime.of(2025, 8, 5, 0, 0); // 开始于当天凌晨零点
        LocalDateTime targetTime = LocalDateTime.of(2025, 8, 5, 7, 23); // 测试时间为早上7:23
        long interval = 15; // 每15分钟一个区间

        Optional<LocalDateTime> result = findBelongingInterval(startTime, targetTime, interval);
        System.out.println(result);
    }
}

